	% á
	% é
	% í
	% ó
	% ú   
	% ñ



\chapter{Metodología de trabajo}\label{chapter:metodologia}

\section{Introducción}
Para el desarrollo de este proyecto se optó por utilizar una metodología de trabajo basada en las buenas prácticas de software establecidas en el artículo publicado por IBM \textit{Best practices for software development projects} \cite{bestP}.

\section{Prácticas de software}
De las prácticas mencionadas anteriormente, las siguientes fueron implementadas satisfactoriamente:

\subsection{Proceso de Desarrollo}
El proceso de desarrollo elegido para este proyecto fue el Proceso Unificado, el cual contiene las siguientes etapas: Captura de Requerimientos, Análisis, Diseño, Implementación y Prueba.

Se optó por darle más importancia a la etapa de Captura de Requerimientos junto con la de Análisis debido a que se puede apreciar el problema en cuestión y la solución propuesta del trabajo.

\subsection{Captura de requisitos}

Reunir y acordar los requerimientos es una etapa fundamental para el éxito de un proyecto. Esto no implica necesariamente que todos los requerimientos deban ser corregidos antes de que el diseño y codificación sean efectuados, pero es importante que el equipo de desarrollo entienda qué necesita construir.

Para comenzar con el desarrollo de \textit{AProba}, dedicamos un tiempo considerable en comprender las necesidades que la organización \fudepan deseaba cubrir con nuestro software. 

\subsection{Diseño}

Aún con una buena arquitectura es posible tener un mal diseño. Los dos principios básicos aquí son ``mantener la simplicidad'' y ``ocultar la información''. En muchos proyectos es importante llevar a cabo un Análisis y Diseño Orientado a Objetos usando UML \footnote{Para más información, visite \url{http://www.uml.org/}}.

Debido a las características del problema planteado para el desarrollo de este proyecto y considerando que ya provee un diseño que permite contar con varias implementaciones, nuestra labor en esta etapa fue, en un principio, entender su diseño e investigar la arquitectura para luego rediseñar las partes que iban a ser afectadas por nuestra implementación.

\subsection{Construcción de código}

Sin duda, una etapa importante del desarrollo fue la construcción del código fuente. Para ello fue necesario disponer de una serie de herramientas que nos permitieran llevar adelante la implementación del proyecto.

Cada cambio realizado en el código, por más mínimo que fue, resultó debidamente probado en su entorno para corroborar que su funcionamiento y adaptación con el resto de los proyectos fuese el esperado.


\subsection{Testing}

El testing es una parte importante de todo proceso de desarrollo de software. En nuestro caso y como se detalló en el capítulo \ref{testing}, se utilizó Google Test para probar diferentes características o secciones de nuestro proyecto. Dichas pruebas permitieron determinar varias fallas o errores que debieron ser corregidos para lograr un correcto funcionamiento.  

\subsection{Gestión de la configuración}

La gestión de la configuración consiste en conocer el estado de todos los artefactos de que componen el sistema o proyecto, gestionar el estado de esos artefactos, y la liberación de diferentes versiones de un sistema.

\subsection{Control de calidad y defectos}

A medida que el proyecto se codifica y se prueban las funcionalidades involucradas en cada revisión, los defectos encontrados, con sus respectivas soluciones, ayudan a medir la madurez del código. Por ello, es importante utilizar un sistema de seguimientos de errores que esté conectado con el sistema de gestión de configuración.


\section{Gestión de la configuración}

Cuando se construye software de computadora, los cambios son inevitables. Además, cada cambio puede aumentar el grado de confusión entre los participantes que se encuentren trabajando en el proyecto. La confusión surge cuando no se han analizado los cambios antes de realizarlos, no se han registrado antes de implementarlos, no se les han comunicado a aquellas personas que necesitan saberlo o no se han controlado de manera que mejoren la calidad y reduzcan los errores.

En este contexto, para desarrollar \textit{AProba}, fue necesario llevar el estado de cada artefacto del software: código fuente, diagramas, archivos de configuración, etc. Se utilizó entonces un repositorio \textit{Mercurial}\footnote{Para mas información, visite \url{http://mercurial.selenic.com/}} alojado en \textit{Google Code}\footnote{Para más información, visite \url{http://code.google.com/projecthosting/}} que nos permitió controlar cada cambio realizado sobre cada elemento del software. 


\section{Seguimiento de errores}

A lo largo de todo el proceso fue necesario hacer diversos seguimientos de errores, tanto de este proyecto como así también de proyectos y librerías importantes para la aplicación.(Ver sección \ref{dependenciasExternas})

Todos los errores, defectos y cambios sobre el proyecto, e inclusive sobre los proyectos externos utilizados, fueron reportados utilizando el sistema de registro de problemas\footnote{Para más información, visite \url{http://code.google.com/p/support/wiki/IssueTrackerAPI/}} o ``issue tracker'' (denominación en Inglés) de Google Code mediante el cuál se pudo hacer un seguimiento de cada detalle informado. 

Para dudas o consultas referidas a los proyectos mencionados anteriormente, se utilizaron diversos medios de comunicación que la fundación provee y que permitieron contactarnos directamente con los desarrolladores del proyecto. Para tal fin, se utilizó un grupo de discusión y un canal de chat, ambos integrados por todos los miembros de \textit{FuDePAN}.


\section{Herramientas}

\subsection{GNU/Linux y Software Libre}

Es un sistema operativo basado en GNU/Linux que está conformado por varios componentes, entre ellos el núcleo Linux y los programas desarrollados por el proyecto GNU.
Linux es un sistema operativo libre del tipo Unix sobre el cual se desarrolló la mayor parte de este proyecto. Tanto este proyecto como así también la mayoría de las herramientas utilizadas a lo largo de su desarrollo se encuentran bajo la licencia \textit{GPL v3.0}, siglas que provienen del inglés \textit{General Public License}. 

El termino ``Libre'' se refiere a la capacidad de poder analizar y modificar el código fuente de la herramienta, permitiendo redistribuir 
el trabajo sin restricción alguna, excepto que se debe mantener la licencia y la referencia a los autores originales. 

\subsection{GNU Toolchain}

Linux ofrece una serie de herramientas de gran utilidad para desarrolladores, de las cuales varias fueron utilizadas para el desarrollo de este proyecto:

\begin{itemize}
\item \textbf{GCC (GNU Compiler Collection)}: Es un conjunto de compiladores creados por el proyecto GNU. Es software libre y distribuido bajo la licencia GPL. 
Originalmente GCC significaba GNU C Compiler (compilador GNU para C), porque sólo compilaba el lenguaje \textit{C}. Posteriormente se extendió para compilar \textit{C++}, \textit{Fortran}, \textit{Ada} y otros.

\item \textbf{GDB (The GNU Project Debbuger)}: Es el depurador estándar desarrollado para  sistema operativo GNU. Es un depurador portable que se puede utilizar en varias plataformas Unix y funciona para varios lenguajes de programación como C, C++ y Fortran.

\item \textbf{CMake}\footnote{Para más informacion, visite \url{http://www.cmake.org/}}: El nombre viene de la abreviatura Cross Platform Make. Es una herramienta multiplataforma y de código abierto utilizada para la generación o automatización de código. 
Fue diseñado para soportar jerarquía de directorios y aplicaciones que dependen de múltiples librerías. 

\item \textbf{\LaTeX}\footnote{Para más informacion, visite \url{http://latex-project.org/}}: Es una herramienta para la composición de textos y está orientada especialmente a la creación de libros, documentos científicos y técnicos que contengan fórmulas matemáticas. También es muy utilizado para la composición de artículos académicos, tesis y libros técnicos, dado que la calidad tipográfica de los documentos realizados con LaTeX es comparable a la de una editorial científica de primera línea.

\item \textbf{Edición}
\begin{description}
 \item \textbf{Gedit}: Es el editor de textos predeterminado de GNOME. Básicamente es un editor de textos de propósito general, 
 cuyo diseño se enfatizó en la simplicidad y facilidad de  uso. Incluye herramientas para la edición de código fuente,
 textos estructurados y lenguajes de marcado. Éste es compatible con UTF-8 para GNU/Linux, Mac OS X y Microsoft Windows.
\item \textbf{Texmaker/Kile}: Son editores de Tex/LaTeX libres, modernos y multi-plataforma(Linux, MacOS y Windows) utilizados para la documentación de este proyecto. Éstos ofrecen muchas herramientas necesarias para el desarrollo de documentos, entre ellas se destacan: soporte para UTF-8, función de auto-completado, corrección ortográfica y visor de pdf incorporado.

\end{description}

\item \textbf{Gráficos}

\begin{description}
\item \textbf{DIA}\footnote{Para más información, visite \url{http://live.gnome.org/Dia/}}: Es un editor de diagramas de propósito general bajo licencia GPL. Se puede utilizar para dibujar diferentes tipos de diagramas. Actualmente cuenta con objetos especiales para ayudar a dibujar diagramas Entidad-Relación, diagramas UML, diagramas de flujo, diagramas de red, entre otros.
\end{description}

\item \textbf{Documentación de código}

\begin{description}
 \item \textbf{Doxygen}: Es un generador de documentación para código fuente. Se aplica en los lenguajes \textit{C}, \textit{C++}, \textit{Java}, \textit{Objective-C} entre otros.
\end{description}

\end{itemize}

\vspace{0.6cm}
Para obtener ciertas librerías necesarias desde repositorios \textbf{Mercurial}, se utilizó la siguiente herramienta:

\begin{description}
\item \textbf{TortoiseHg}
TortoiseHG es un cliente del control de versiones Mercurial, implementado como una extensión para el Shell de Windows. 
También incluye extensiones para GNOME/Nautilus. Más información en \url{http://tortoisehg.bitbucket.org/}

\end{description}
